package com.learn.config;

import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;

@Configuration
public class ShiroConfig {


    //realm


    //    filter
//   控制请求走shiro
    @Bean
    public ShiroFilterFactoryBean shiroFilter() {
//
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //        设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager());

////        设置内置过滤器
////        anon： 无需认证就可以访问
////        authc： 必须认证了才能访问
////        user： 必须拥有记住我功能才能用
////        perms： 拥有对某个资源的权限才能访问
////        role： 拥有某个角色权限
//        //  控制 访问xx资源 需要xx权限
//        LinkedHashMap<String, String> filterMap = new LinkedHashMap<>();

//        实现登录拦截
//        设置接口权限
        //授权，正常情况下，没有授权会跳转到为授权页面
//        授权
//        filterMap.put("/user/add", "perms[user:add]");
//        filterMap.put("/user/update", "perms[user:update]");

//        角色权限
        //当用户删除用户时，需要有超级管理员角色
//        filterChainMap.put("/user/del/*","roles[role_superman]");
//        退出登陆
//        filterMap.put("/logout", "logout");
//        认证
//        filterMap.put("/api/v3/*", "authc");

//        控制映射关系
//        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
////        设置登录页面，未认证默认弹回登录页面
//        shiroFilterFactoryBean.setLoginUrl("/login");
        return shiroFilterFactoryBean;
    }


    //    安全管理器
    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm());
        return securityManager;
    }

    //    realm 和数据库进行交互
    //0.配置shiroFilter
    @Bean("userRealm")
    public UserRealm userRealm() {
        UserRealm userRealm = new UserRealm();
//        设置密码匹配方法
//        userRealm.setCredentialsMatcher(hashedCredentialsMatcher());
        return userRealm;
    }


    //    配置支持注解
    @Bean
    public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
        advisorAutoProxyCreator.setProxyTargetClass(true);
        return advisorAutoProxyCreator;
    }


    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); // 这里需要注入 SecurityManger 安全管理器
        return authorizationAttributeSourceAdvisor;
    }


    //    自定义会话管理器
//    @Bean
//    public SessionManager sessionManager() {
//        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
//        sessionManager.setSessionDAO(redisSessionDAO());
//
//        //设置会话过期时间
//        sessionManager.setGlobalSessionTimeout(3 * 60 * 1000); //默认半小时
//        sessionManager.setDeleteInvalidSessions(true); //默认自定调用SessionDAO的delete方法删除会话
//        //设置会话定时检查
//        //        sessionManager.setSessionValidationInterval(180000); //默认一小时
//        //        sessionManager.setSessionValidationSchedulerEnabled(true);
//        return sessionManager;
//    }

//    @Bean
//    public SessionDAO redisSessionDAO() {
//        ShiroRedisSessionDao redisDAO = new ShiroRedisSessionDao();
//        return redisDAO;
//    }
}
